package doing.doing_501_1000;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.*;

/**
 * 784. Letter Case Permutation 字母大小写全排列
 * <p>
 * 给定一个字符串S，通过将字符串S中的每个字母转变大小写，
 * 我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
 * <p>
 * 示例:
 * 输入: S = "a1b2"
 * 输出: ["a1b2", "a1B2", "A1b2", "A1B2"]
 * <p>
 * 输入: S = "3z4"
 * 输出: ["3z4", "3Z4"]
 *
 * @author 大硕
 * 2019-04-07 7:30 AM
 **/
@Slf4j
@SuppressWarnings("all")
public class LetterCasePermutation {

    public List<String> letterCasePermutation(String S) {
        List<String> list = new ArrayList<>();
        list.add("");

        for (char cur : S.toCharArray()) {
            int len = list.size();

            // 从后向前遍历列表 list
            while (len-- > 0) {

                // 移除列表第一个元素
                String head = list.remove(0);
                list.add(head + cur);

                // 小写替换为大写
                // 'A' ^ 32 = 'a'
                // 'a' ^ 32 = 'A'
                if (Character.isLetter(cur)) {
                    list.add(head + (char) (cur ^ 32));
                }
                log.info("list:{}", list);
            }
        }
        return list;
    }

    @Test
    public void test() {
        String msg = "a1b2";
        log.info("{}", letterCasePermutation(msg));
    }
}




























/*
public List<String> letterCasePermutation(String S) {
    List<String> list = new ArrayList<>();
    list.add("");

    for (char cur : S.toCharArray()) {
        int len = list.size();

        // 从后向前遍历列表 list
        while (len-- > 0) {

            // 移除列表第一个元素
            String head = list.remove(0);
            list.add(head + cur);

            // 小写替换为大写
            // A ^ 32 = a 同理 a ^ 32 = A
            if (Character.isLetter(cur)) {
                list.add(head + (char)(cur^32));
            }
        }
    }
    return list;
}
*/
